package com.tedu.aopdemo.aop;
//package Demo;


import org.aspectj.lang.JoinPoint;
import org.aspectj.lang.ProceedingJoinPoint;
import org.aspectj.lang.annotation.*;
import org.springframework.stereotype.Component;

import java.util.Arrays;

/**
 *

 */
@Component  //该类也需要让spring容器管理
@Aspect  //让容器知道他是一个切面
public class SysoutAspect {

//
//    @Before("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
//    public void before(JoinPoint joinPoint) {
////        System.out.println("target: "+joinPoint.getTarget());
////        System.out.println(joinPoint.getSignature().getName());
////        System.out.println("参数 "+ Arrays.toString(joinPoint.getArgs()));
////        System.out.println(joinPoint.getThis());
//        String methodName=joinPoint.getSignature().getName();
//        String className=joinPoint.getTarget().getClass().getSimpleName();
//        String args=Arrays.toString(joinPoint.getArgs());
//        System.out.println("开始调用了"+className+"."+methodName+"(),实参为"+args);
//    }
//
//
//
//
//    @AfterReturning(
//            value ="execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))",
//            returning = "returnValue"  //说明将实际方法返回值传递给下面方法 的哪个参数
//    )     //表示切入点为实际方法调用完毕并返回结果后调用   该切入点方法除了可以获取切入点信息
//    public void afterReturing(JoinPoint joinPoint,Object returnValue) {
//        String methodName=joinPoint.getSignature().getName();
//        String className=joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"()执行完毕，返回值为"+returnValue);
//    }
//
//
//    @After("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
//    public void after(JoinPoint joinPoint){
//        String methodName=joinPoint.getSignature().getName();
//        String className=joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"() 完毕 ！");
//
//    }
//
//
//    /**
//     * 切入点是实际方法抛出异常后进行
//     */
//    @AfterThrowing(
//            value = "execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))",
//            throwing = "e"  //表示实际方法抛出异常传递给下面方法的哪个参数
//    )
//    public void afterThrowing(JoinPoint joinPoint,Exception e) {
//        String methodName=joinPoint.getSignature().getName();
//        String className=joinPoint.getTarget().getClass().getSimpleName();
//        System.out.println(className+"."+methodName+"() 抛出异常了 ！"+e.getMessage());
//
//    }
//


    /**
     * @Around 环切，切入点结合上述几个
     * 所有的切入点，通常使用异常处理机制进行
     * @param joinPoint
     * @return
     * @throws Throwable
     */
    @Around("execution(public int com.tedu.aopdemo.aop.CalculatorImpl.*(..))")
    public  Object around(ProceedingJoinPoint joinPoint) throws Throwable {
        String methodName = joinPoint.getSignature().getName();
        String className = joinPoint.getTarget().getClass().getName();
        String args = Arrays.toString(joinPoint.getArgs());
        System.out.println(className+"."+methodName+"() 开始执行方法，参数为"+args);
        try {

            Object result = joinPoint.proceed();
            System.out.println(className+"."+methodName+"()执行完毕");
            return result;
        }catch (Throwable e){
            System.out.println(className+"."+methodName+"()出现异常"+e.getMessage());
            throw new RuntimeException();

        }finally {
            System.out.println(className+"."+methodName+"()最终执行完毕");
        }

    }




}
